<?php
/**
 * ログイン制御モジュール Login
 */
class Login {
	// ログイン済みフラグ
	private $iSLogined_flg;

	public function __construct () {
		$this->isLogined_flg = false;
	}
	
	public function init () {
		Y('this.Form+', null);
	}

	public function call ($Mode = null) {
		Y('this.User+', array());

		switch (strtolower($Mode)) {
			case '' :
				return $this->isLogined();
			case 'getmenu' :
				return $this->getMenu();
			case 'logout' :
				return $this->logout();
			default:
				return false;
		}
	}

	/**
	 * ログインしているか否か
	 */
	public function isLogined () {
		if ($this->isLogined_flg) return true;

		Y('Helper.loadAction', 'Session');
		Y('Helper.load', 'ConnectDB');

		if (Y('Request.POST.Login_ID')) {
			$Query =array (
				'query'=>'select',
				'table'=>'Login_UserAuth',
				'data'=>array('UserID'=>Y('Request.POST.Login_ID')),
				'limit'=>1
				);

			Y('Helper.List.ConnectDB.Com', $Query);

			$Auth = Y('Helper.List.ConnectDB.Com.Result');
			if ($Auth == false) return false;

			// TODO: 暗号化は別途メソッド化したい。
			if (empty($Auth['UserPassword'])) $Auth['UserPassword'] = md5('');
			$Password = md5(Y('Request.POST.Login_Password'));

			if (strcmp ($Password, $Auth['UserPassword'])) {
				// ログイン失敗
				return false;
			} else {
				Y('Helper.List.Session.Vars.Login+', true);
				Y('Helper.List.Session.Vars.UID+', $Auth['ID']);
				$this->preLogin ($Auth['ID']);
				return true;
			}
		} elseif (Y('Helper.List.Session.Vars.Login')) {
			// ログイン後の経過時間を判定
			// TODO: 現状２時間で設定。後で設定値として別にすること。
			if (Y('Helper.List.Session.Vars.LastAccess') < time() - 3600 * 2) {
				Y('Helper.List.Session.Vars.Login+', false);
				return false;
			} else {
				$this->preLogin (Y('Helper.List.Session.Vars.UID'));
				return true;
			}
		} else {
			return false;
		}
	}

	/**
	 * ログアウトする
	 */
	public function logout () {
		Y('Helper.loadAction', 'Session');
		Y('Helper.List.Session.Vars.Login+', false);
		Y('Output.Desc.Message+', 'ログアウトしました。');
		return true;
	}

	/**
	 * ログイン時の定型処理
	 */
	private function preLogin ($UID) {
		// ログインしている場合、ユーザデータを読み込む
		$Query =array (
			'query'=>'select',
			'table'=>'Login_UserData',
			'data'=>array('UserID'=>$UID),
			);
		Y('Helper.List.ConnectDB.Com', $Query);
		while ($Data = Y('Helper.List.ConnectDB.Com.Result')) {
			Y('this.User.'.$Data['Field'].'+', $Data['Value']);
		}
		Y('this.User.UID+', $UID);
		
		// Editor用オブジェクト登録
		Y('this.getAuth+', YuTori::create($this, 'getAuthData'));
		Y('this.updateAuth+', YuTori::create($this, 'updateAuthData'));
		Y('this.insertAuth+', YuTori::create($this, 'insertAuthData'));
		Y('this.deleteAuth+', YuTori::create($this, 'deleteAuthData'));

		Y('Helper.List.Session.Vars.LastAccess+', time());
		$this->isLogined_flg = true;

		if (!strcasecmp(Y('this.User.Permission'), 'admin')) {
			Y('this.Admin+', YuTori::create($this, 'callAdmin'));
		}
	}
	
	/**
	 * Admin処理
	 * アカウント管理
	 */
	public function callAdmin ($Act) {
		$Op = Y('Request.Global.Op');
		Y('Logger.Debug', 'Admin処理開始:[Act]'.$Act.'[Op]'.$Op);
		$Mode = array_pad(explode ('/', $Op, 2), 2, null);
		switch ($Act) {
			case 'edit' :
				return Y('Module.loadAction', 'Editor', 'Login/edit', 'edit.yml', $Mode[0], $Mode[1], Y('Document.toObject$'));
			default:
				return false;
		}
	}

	public function getAuthData () {
		$Query = array('query'=>'select', 'table'=>'Login_UserAuth', 'data'=>array('ID'=>(int)Y('Module.List.Editor.Target')));
		Y('Helper.loadAction', 'ConnectDB', $Query);
		$Data = Y('Helper.List.ConnectDB.com.ResultAll');
		Y('Module.List.Editor$')->Data = $Data;
		
		$Query = array('query'=>'select', 'table'=>'Login_UserData', 'data'=>array('UserID'=>(int)Y('Module.List.Editor.Target')));
		Y('Helper.List.ConnectDB', $Query);
		while ($Field = Y('Helper.List.ConnectDB.com.Result')) {
			Y('Module.List.Editor$')->YML['validate']['data['.$Field['Field'].']'] = array(
				'string'	=> $Field['Field'],
				'necessary'=> "no",
				'type'		=>	"string",
				'form'		=>	"text",
				'description'=>'追加データフィールドです。'
				);
			Y('Module.List.Editor$')->Data[0]['data['.$Field['Field'].']'] = $Field['Value'];
		}

		return true;
	}

	/**
	 * アカウントの新規追加処理
	 */
	public function insertAuthData () {
		$Data = Y('Request.POST');
		if(!$vData = $this->validateAuthData ($Data)) return false;
		$vData['RegistTime'] = time();
		$vData['ID'] = 0;
		$Query = array('query'=>'insert', 'table'=>'Login_UserAuth', 'data'=>$vData);

		$NewID = Y('Helper.loadAction', 'ConnectDB', $Query);
		Y('Module.List.Editor$')->Xml['newID'] = $NewID;

		// Dataフィールドの処理
		if (empty($Data['data'])) return true;
		$this->updateDataField($NewID, $Data['data']);
		return true;
	}

	/**
	 * アカウントの更新処理
	 */
	public function updateAuthData () {
		$Data = Y('Request.POST');
		if(!$vData = $this->validateAuthData ($Data)) return false;
		$Query = array('query'=>'update', 'table'=>'Login_UserAuth', 'data'=>$vData, 'where'=>'ID=:ID');

		if (!$Res = Y('Helper.loadAction', 'ConnectDB', $Query)) return false;
		Y('Module.List.Editor$')->Xml['datacount'] = $Res;

		// Dataフィールドの処理
		if (empty($Data['data'])) return true;
		$this->updateDataField((int)$Data['ID'], $Data['data']);
		return true;
	}
	
	/**
	 * アカウントの削除処理
	 */
	public function deleteAuthData () {
		$Data['ID'] = Y('Request.POST.ID');
		$Query = array('query'=>'update', 'table'=>'Login_UserAuth', 'data'=>$Data, 'where'=>'ID=:ID');

		if (!$Res = Y('Helper.loadAction', 'ConnectDB', $Query)) return false;
		Y('Module.List.Editor$')->Xml['datacount'] = $Res;
		return true;
	}

	/**
	 * アカウント変更処理用　データバリデート
	 */
	private function validateAuthData ($Data) {
		// バリデート実行
		Y('Helper.loadAction', 'Validate', Y('Module.List.Editor.YML', 'validate'));
		$vData = Y('Helper.List.Validate.exec', $Data);

		if ($Err = Y('Helper.List.Validate.getError')) {
			Y('Module.List.Editor.setMessage', $Err);
			return false;
		}

		if ($vData['UserPassword']) $vData['UserPassword'] = md5($vData['UserPassword']);
		else unset ($vData['UserPassword']);
		
		$vData['UpdateTime'] = time();
		return $vData;
	}

	/**
	 * アカウント変更所利用　dataフィールドの更新処理
	 */
	private function updateDataField ($NewID, $Data) {
		$NewID = (int) $NewID;
		$Query = array('query'=>'delete', 'table'=>'Login_UserData', 'data'=>array('UserID'=>$NewID));
		Y('Helper.List.ConnectDB', $Query);
		foreach ((array)$Data as $Key=>$Val) {
			if (!$Val) continue;
			$aData = array();
			$aData['UserID'] = $NewID;
			$aData['Field'] = $Key;
			$aData['Value'] = $Val;
			$Query = array('query'=>'insert', 'table'=>'Login_UserData', 'data'=>$aData);
			Y('Helper.List.ConnectDB', $Query);
		}
	}
}
?>
